物理キーボード用拡張shortcut keyを導入するUserScript
code:js
import('/api/code/takker/物理キーボード用拡張shortcut_keyを導入するUserScript/script.js');
2021-08-12
このページのUserScriptの代わりに↑を使っている
15:23:40 そもそもKeyboardEventを送信できていないことが分かった
とすると、取れる手としてはKeyboardEventが発火する別のkeyの組み合わせを代わりに使うしかなさそうだ
#editorではなく#text-inputでkeydownを監視しているのがうまくいかない原因の一つなんじゃないか?
つまり、#text-inputによる文字入力が有効でない状態ではキー入力を受け付けてくれない
一方、#editorならどの状態でもキー入力を取得できそう
ページのスクロールなどのキー入力は受け付けてくれるので
dependencies
code:script.js
import {press} from '../scrapbox-keyboard-emulation-2/script.js';
import {insertText} from '../scrapbox-insert-text-2/script.js';
import {sleep} from '../sleep/script.js';
(() => {
const textInput = document.getElementById('text-input');
if (!/mobile/i.test(navigator.userAgent)) return;
textInput.addEventListener('keydown', async e => {
switch(e.key) {
case 'x':
case 'c': {
if (!e.ctrlKey || e.shiftKey || e.altKey) return;
その際focusがはずれてしまうので、focusを当て直す処理をしている
11:55:20 focusを当てるだけではキーボードが有効にならないみたい?
長押しに相当する何かをしないとだめそう
code:script.js
const buttons = document.getElementsByClassName('button');
for (const button of buttons) {
if (button.textContent.trim() !== 'Copy') continue;
button.click();
textInput.focus();
Ctrl+xのときは文字列を削除する必要がある。
しかし、Copyを押した時点で選択範囲が消えてしまっているので再び選択範囲を表示させる必要がある
そこで、clipboardからコピーした文字列を読み直し、その文字列の長さだけ文字を消すようにする
code:script.js
if (e.key === 'c') return;
const text = await navigator.clipboard.readText();
text.split('').forEach(_ => press('ArrowLeft', {shiftKey: true}));
press('Delete');
return;
}
}
case 'v':
if (!e.ctrlKey || e.shiftKey || e.altKey) return;
const text = await navigator.clipboard.readText();
await insertText(text);
return;
アウトライン編集
2021-07-22 13:16:30 現状動いていない
と思ったのだがどうやらそれでもだめそうだ
code:script.js
case 'ArrowUp':
if (e.shiftKey) return;
if (e.ctrlKey && e.altKey) return; // 同時押しは無視
if (!e.ctrlKey && !e.altKey) return;
e.preventDefault();
e.stopPropagation();
if (e.ctrlKey) {
press('ArrowUp', {ctrlKey: true});
return;
}
if (e.altKey) {
press('ArrowUp', {altKey: true});
return;
}
case 'ArrowDown':
if (e.shiftKey) return;
if (e.ctrlKey && e.altKey) return; // 同時押しは無視
if (!e.ctrlKey && !e.altKey) return;
e.preventDefault();
e.stopPropagation();
if (e.ctrlKey) {
press('ArrowDown', {ctrlKey: true});
return;
}
if (e.altKey) {
press('ArrowDown', {altKey: true});
return;
}
case 'i':
if (e.ctrlKey || e.shiftKey || !e.altKey) return;
textInput.focus();
return;
}
});
})();